#!/bin/bash
################################################################################
# FurryOS Master Build System v4.2
# "I designed the OS, and AI wrote the code."
#
# CHANGES:
# - NO heredocs (EOF) used anywhere to prevent copy-paste syntax errors.
# - Uses line-by-line writing for maximum stability.
# - Uses 'fastfetch' instead of dead 'neofetch'.
################################################################################

set -e
set -o pipefail
set -u

# --- CONFIGURATION ---
readonly OS_NAME="Furryos"
readonly VERSION="8.1.0"
readonly DEBIAN_RELEASE="trixie"
readonly ARCH="amd64"
readonly DATE=$(date +%Y%m%d-%H%M)
readonly BUILD_LOG="build-${DATE}.log"
readonly WORK_DIR="$(pwd)"
readonly PARENT_DIR="$(dirname "$WORK_DIR")"
readonly BUILD_OUTPUT_DIR="$PARENT_DIR/FurryOS-Builds"

# --- LOGGING ---
log_info() { echo -e "\033[0;34m[INFO]\033[0m ${*}" | tee -a "$BUILD_LOG"; }
log_success() { echo -e "\033[0;32m[SUCCESS]\033[0m ${*}" | tee -a "$BUILD_LOG"; }
log_error() { echo -e "\033[0;31m[ERROR]\033[0m ${*}" | tee -a "$BUILD_LOG"; }

# --- CHECKS ---
if [ "$EUID" -ne 0 ]; then
    log_error "Must run as root: sudo ./build4.sh"
    exit 1
fi

# --- CLEANUP ---
log_info "Cleaning environment..."
# Unmount things that might be stuck from previous failed runs
umount -lf chroot/dev/pts 2>/dev/null || true
umount -lf chroot/dev 2>/dev/null || true
umount -lf chroot/proc 2>/dev/null || true
umount -lf chroot/sys 2>/dev/null || true

# Run standard clean
lb clean --purge 2>&1 | tee -a "$BUILD_LOG"
rm -f *.iso *.iso.* 2>/dev/null || true
rm -rf config/package-lists config/includes.chroot config/hooks

# --- CONFIGURE ---
log_info "Configuring Live-Build..."
lb config \
    --distribution "$DEBIAN_RELEASE" \
    --architecture "$ARCH" \
    --archive-areas "main contrib non-free non-free-firmware" \
    --security true \
    --updates true \
    --backports false \
    --bootappend-live "boot=live components quiet splash hostname=furryos persistence username=anthro" \
    --linux-packages "linux-image linux-headers" \
    --iso-volume "${OS_NAME}_${VERSION}" \
    --iso-application "$OS_NAME" \
    --iso-publisher "Anthro Entertainment LLC" \
    --memtest none \
    --checksums sha256 \
    2>&1 | tee -a "$BUILD_LOG"

# Fix for squashfs xattrs error
echo 'LB_MKSQUASHFS_OPTIONS="-no-xattrs"' >> config/binary

# --- DEFINE PACKAGES ---
log_info "Defining packages..."
mkdir -p config/package-lists
LIST_FILE="config/package-lists/furryos-base.list.chroot"

# Writing packages one by one to ensure no syntax errors
echo "mate-desktop-environment-core" > "$LIST_FILE"
echo "mate-utils" >> "$LIST_FILE"
echo "mate-control-center" >> "$LIST_FILE"
echo "lightdm" >> "$LIST_FILE"
echo "network-manager-gnome" >> "$LIST_FILE"
echo "plymouth" >> "$LIST_FILE"
echo "plymouth-themes" >> "$LIST_FILE"
echo "firefox-esr" >> "$LIST_FILE"
echo "curl" >> "$LIST_FILE"
echo "wget" >> "$LIST_FILE"
echo "git" >> "$LIST_FILE"
echo "vim" >> "$LIST_FILE"
echo "nano" >> "$LIST_FILE"
echo "gparted" >> "$LIST_FILE"
echo "htop" >> "$LIST_FILE"
echo "fastfetch" >> "$LIST_FILE"
echo "software-properties-common" >> "$LIST_FILE"
echo "pipewire" >> "$LIST_FILE"
echo "wireplumber" >> "$LIST_FILE"
echo "pavucontrol" >> "$LIST_FILE"
echo "mpg123" >> "$LIST_FILE"
echo "ffmpeg" >> "$LIST_FILE"
echo "python3" >> "$LIST_FILE"
echo "python3-gi" >> "$LIST_FILE"
echo "python3-cairo" >> "$LIST_FILE"
echo "gir1.2-gtk-3.0" >> "$LIST_FILE"
echo "libglib2.0-bin" >> "$LIST_FILE"

# --- ASSETS & SCRIPTS ---
log_info "Injecting assets..."
CHROOT="config/includes.chroot"
mkdir -p "${CHROOT}/usr/share/backgrounds/furryos"
mkdir -p "${CHROOT}/usr/share/sounds/furryos"
mkdir -p "${CHROOT}/usr/local/bin"
mkdir -p "${CHROOT}/etc/skel/Desktop"
mkdir -p "${CHROOT}/etc/xdg/autostart"
mkdir -p "${CHROOT}/usr/share/applications"

# Copy Wallpapers/Sounds/Images
if [ -d "assets/wallpapers" ]; then rsync -a assets/wallpapers/ "${CHROOT}/usr/share/backgrounds/furryos/"; fi
if [ -d "assets/sounds" ]; then rsync -a assets/sounds/ "${CHROOT}/usr/share/sounds/furryos/"; fi
if [ -d "assets/images" ]; then mkdir -p "${CHROOT}/etc/skel/Pictures"; rsync -a assets/images/ "${CHROOT}/etc/skel/Pictures/"; fi

# --- SCRIPT 1: Startup Sound ---
STARTUP_FILE="${CHROOT}/etc/xdg/autostart/furryos-startup-sound.desktop"
echo "[Desktop Entry]" > "$STARTUP_FILE"
echo "Type=Application" >> "$STARTUP_FILE"
echo "Name=FurryOS Startup Sound" >> "$STARTUP_FILE"
echo "Exec=mpg123 /usr/share/sounds/furryos/startup.mp3" >> "$STARTUP_FILE"
echo "Terminal=false" >> "$STARTUP_FILE"
echo "NoDisplay=true" >> "$STARTUP_FILE"
echo "X-GNOME-Autostart-enabled=true" >> "$STARTUP_FILE"

# --- SCRIPT 2: Live Border (Python) ---
BORDER_FILE="${CHROOT}/usr/local/bin/furryos-live-border"
echo '#!/usr/bin/env python3' > "$BORDER_FILE"
echo 'import gi, cairo, os' >> "$BORDER_FILE"
echo "gi.require_version('Gtk', '3.0')" >> "$BORDER_FILE"
echo 'from gi.repository import Gtk, Gdk, GLib' >> "$BORDER_FILE"
echo '' >> "$BORDER_FILE"
echo 'class LiveBorder(Gtk.Window):' >> "$BORDER_FILE"
echo '    def __init__(self):' >> "$BORDER_FILE"
echo '        super().__init__()' >> "$BORDER_FILE"
echo '        if not os.path.exists("/lib/live/mount"): exit(0)' >> "$BORDER_FILE"
echo '        self.set_title("FurryOS Live")' >> "$BORDER_FILE"
echo '        self.set_decorated(False)' >> "$BORDER_FILE"
echo '        self.set_keep_above(True)' >> "$BORDER_FILE"
echo '        self.set_app_paintable(True)' >> "$BORDER_FILE"
echo '        self.set_accept_focus(False)' >> "$BORDER_FILE"
echo '        self.set_skip_taskbar_hint(True)' >> "$BORDER_FILE"
echo '        screen = self.get_screen()' >> "$BORDER_FILE"
echo '        visual = screen.get_rgba_visual()' >> "$BORDER_FILE"
echo '        if visual and screen.is_composited(): self.set_visual(visual)' >> "$BORDER_FILE"
echo '        monitor = Gdk.Display.get_default().get_primary_monitor()' >> "$BORDER_FILE"
echo '        geo = monitor.get_geometry()' >> "$BORDER_FILE"
echo '        self.set_default_size(geo.width, geo.height)' >> "$BORDER_FILE"
echo '        self.move(0, 0)' >> "$BORDER_FILE"
echo '        self.alpha = 1.0' >> "$BORDER_FILE"
echo '        self.fade = -0.05' >> "$BORDER_FILE"
echo '        self.connect("draw", self.on_draw)' >> "$BORDER_FILE"
echo '        GLib.timeout_add(100, self.animate)' >> "$BORDER_FILE"
echo '        self.show_all()' >> "$BORDER_FILE"
echo '' >> "$BORDER_FILE"
echo '    def animate(self):' >> "$BORDER_FILE"
echo '        self.alpha += self.fade' >> "$BORDER_FILE"
echo '        if self.alpha <= 0.4: self.fade = 0.05' >> "$BORDER_FILE"
echo '        elif self.alpha >= 0.9: self.fade = -0.05' >> "$BORDER_FILE"
echo '        self.queue_draw()' >> "$BORDER_FILE"
echo '        return True' >> "$BORDER_FILE"
echo '' >> "$BORDER_FILE"
echo '    def on_draw(self, widget, cr):' >> "$BORDER_FILE"
echo '        w, h = widget.get_allocated_width(), widget.get_allocated_height()' >> "$BORDER_FILE"
echo '        cr.set_source_rgba(1.0, 0.42, 0.21, self.alpha)' >> "$BORDER_FILE"
echo '        cr.set_line_width(8)' >> "$BORDER_FILE"
echo '        cr.rectangle(0, 0, w, h)' >> "$BORDER_FILE"
echo '        cr.stroke()' >> "$BORDER_FILE"
echo '        text = "🐾 LIVE MODE 🐾"' >> "$BORDER_FILE"
echo '        cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)' >> "$BORDER_FILE"
echo '        cr.set_font_size(16)' >> "$BORDER_FILE"
echo '        ext = cr.text_extents(text)' >> "$BORDER_FILE"
echo '        cr.set_source_rgba(0,0,0,0.8)' >> "$BORDER_FILE"
echo '        cr.rectangle((w/2)-(ext.width/2)-10, 0, ext.width+20, ext.height+20)' >> "$BORDER_FILE"
echo '        cr.fill()' >> "$BORDER_FILE"
echo '        cr.set_source_rgba(1,1,1,1)' >> "$BORDER_FILE"
echo '        cr.move_to((w/2)-(ext.width/2), ext.height+5)' >> "$BORDER_FILE"
echo '        cr.show_text(text)' >> "$BORDER_FILE"
echo '' >> "$BORDER_FILE"
echo 'if __name__ == "__main__":' >> "$BORDER_FILE"
echo '    app = LiveBorder()' >> "$BORDER_FILE"
echo '    Gtk.main()' >> "$BORDER_FILE"

chmod +x "$BORDER_FILE"

# Live Border Autostart
BORDER_AUTO="${CHROOT}/etc/xdg/autostart/furryos-live-border.desktop"
echo "[Desktop Entry]" > "$BORDER_AUTO"
echo "Type=Application" >> "$BORDER_AUTO"
echo "Name=FurryOS Live Border" >> "$BORDER_AUTO"
echo "Exec=/usr/local/bin/furryos-live-border" >> "$BORDER_AUTO"
echo "Terminal=false" >> "$BORDER_AUTO"
echo "NoDisplay=true" >> "$BORDER_AUTO"
echo "X-GNOME-Autostart-enabled=true" >> "$BORDER_AUTO"


# --- SCRIPT 3: Mode Installer (Python) ---
INSTALLER_FILE="${CHROOT}/usr/local/bin/furryos-mode-installer"
echo '#!/usr/bin/env python3' > "$INSTALLER_FILE"
echo 'import gi, os, subprocess' >> "$INSTALLER_FILE"
echo "gi.require_version('Gtk', '3.0')" >> "$INSTALLER_FILE"
echo 'from gi.repository import Gtk' >> "$INSTALLER_FILE"
echo '' >> "$INSTALLER_FILE"
echo 'class ModeInstaller(Gtk.Window):' >> "$INSTALLER_FILE"
echo '    def __init__(self):' >> "$INSTALLER_FILE"
echo '        super().__init__(title="FurryOS Mode Installer")' >> "$INSTALLER_FILE"
echo '        self.set_border_width(15)' >> "$INSTALLER_FILE"
echo '        self.set_default_size(450, 400)' >> "$INSTALLER_FILE"
echo '        self.set_position(Gtk.WindowPosition.CENTER)' >> "$INSTALLER_FILE"
echo '        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)' >> "$INSTALLER_FILE"
echo '        self.add(vbox)' >> "$INSTALLER_FILE"
echo '        lbl = Gtk.Label()' >> "$INSTALLER_FILE"
echo "        lbl.set_markup(\"<span size='x-large' weight='bold'>Choose Your Path</span>\")" >> "$INSTALLER_FILE"
echo '        vbox.pack_start(lbl, False, False, 10)' >> "$INSTALLER_FILE"
echo '        modes = [' >> "$INSTALLER_FILE"
echo '            ("👵 Granny Mode", "Simple games (Solitaire, Mines) & accessibility.", "gnome-games aisleriot gnome-accessibility-themes"),' >> "$INSTALLER_FILE"
echo '            ("🎮 Gamer Mode", "Steam, Lutris, GameMode, Mangohud.", "steam-installer lutris gamemode mangohud"),' >> "$INSTALLER_FILE"
echo '            ("💻 Hacker Mode", "VSCode, Docker, Git, Build-Essential.", "git build-essential docker.io code"),' >> "$INSTALLER_FILE"
echo '            ("👻 Paranoid Mode", "Tor, OnionShare, Strict Firewall.", "tor onionshare ufw")' >> "$INSTALLER_FILE"
echo '        ]' >> "$INSTALLER_FILE"
echo '        for name, desc, pkgs in modes:' >> "$INSTALLER_FILE"
echo '            btn = Gtk.Button()' >> "$INSTALLER_FILE"
echo '            b_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=2)' >> "$INSTALLER_FILE"
echo '            l_n = Gtk.Label(); l_n.set_markup(f"<b>{name}</b>")' >> "$INSTALLER_FILE"
echo '            l_d = Gtk.Label(label=desc); l_d.set_line_wrap(True)' >> "$INSTALLER_FILE"
echo '            b_box.pack_start(l_n, True, True, 0)' >> "$INSTALLER_FILE"
echo '            b_box.pack_start(l_d, True, True, 0)' >> "$INSTALLER_FILE"
echo '            btn.add(b_box)' >> "$INSTALLER_FILE"
echo '            btn.connect("clicked", self.install, name, pkgs)' >> "$INSTALLER_FILE"
echo '            vbox.pack_start(btn, True, True, 5)' >> "$INSTALLER_FILE"
echo '' >> "$INSTALLER_FILE"
echo '    def install(self, widget, mode_name, packages):' >> "$INSTALLER_FILE"
echo '        confirm = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, f"Install {mode_name}?")' >> "$INSTALLER_FILE"
echo '        confirm.format_secondary_text("This will download and install packages. Internet required.")' >> "$INSTALLER_FILE"
echo '        response = confirm.run()' >> "$INSTALLER_FILE"
echo '        confirm.destroy()' >> "$INSTALLER_FILE"
echo '        if response == Gtk.ResponseType.YES:' >> "$INSTALLER_FILE"
echo '            cmd = f"bash -c '"'sudo apt update; sudo apt install -y {packages}; echo Done! Press Enter to close.; read'"'"' >> "$INSTALLER_FILE"
echo '            subprocess.Popen(["mate-terminal", "-e", cmd])' >> "$INSTALLER_FILE"
echo '' >> "$INSTALLER_FILE"
echo 'win = ModeInstaller()' >> "$INSTALLER_FILE"
echo 'win.connect("destroy", Gtk.main_quit)' >> "$INSTALLER_FILE"
echo 'win.show_all()' >> "$INSTALLER_FILE"
echo 'Gtk.main()' >> "$INSTALLER_FILE"

chmod +x "$INSTALLER_FILE"

# Mode Installer Desktop Shortcut
APP_DESKTOP="${CHROOT}/usr/share/applications/furryos-mode-installer.desktop"
echo "[Desktop Entry]" > "$APP_DESKTOP"
echo "Version=1.0" >> "$APP_DESKTOP"
echo "Type=Application" >> "$APP_DESKTOP"
echo "Name=Install Modes (Gamer/Hacker)" >> "$APP_DESKTOP"
echo "Comment=Customize your FurryOS experience" >> "$APP_DESKTOP"
echo "Exec=/usr/local/bin/furryos-mode-installer" >> "$APP_DESKTOP"
echo "Icon=system-software-install" >> "$APP_DESKTOP"
echo "Terminal=false" >> "$APP_DESKTOP"
echo "Categories=System;" >> "$APP_DESKTOP"

cp "$APP_DESKTOP" "${CHROOT}/etc/skel/Desktop/"
chmod +x "${CHROOT}/etc/skel/Desktop/furryos-mode-installer.desktop"

# --- BUILD ---
log_info "Starting Build..."
lb build 2>&1 | tee -a "$BUILD_LOG"

# --- FINALIZE ---
log_info "Finalizing..."
ISO_NAME="${OS_NAME}-${VERSION}-${ARCH}.iso"
mkdir -p "$BUILD_OUTPUT_DIR"
if [ -f "live-image-${ARCH}.hybrid.iso" ]; then
    mv "live-image-${ARCH}.hybrid.iso" "$BUILD_OUTPUT_DIR/$ISO_NAME"
    log_success "ISO Created: $BUILD_OUTPUT_DIR/$ISO_NAME"
    
    # Generate checksum
    cd "$BUILD_OUTPUT_DIR"
    sha256sum "$ISO_NAME" > "${ISO_NAME}.sha256"
    cd "$WORK_DIR"
fi

# Cleanup
mv chroot binary cache .build "$PARENT_DIR/" 2>/dev/null || true
log_success "Build Script Complete!"
